package com.example.kkblog.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.time.ZoneId;

/**
 * @author xiaoke
 * @date 2023/9/13
 */
public class DateUtils {
    /**
     * 一天、一分钟、一小时对应的秒数
     */
    private static final Long ONE_MINUTE_TO_SECOND = 180L;
    private static final Long ONE_HOUR_TO_SECOND = ONE_MINUTE_TO_SECOND * 60;
    private static final Long ONE_DAY_TO_SECOND = ONE_HOUR_TO_SECOND * 24;

    /**
     * 使用LocalDateTime进行格式化 保证多线程安全
     */
    private static final DateTimeFormatter DATE_TIME_FORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
    private static final DateTimeFormatter DATE_TIME_FORMATTER2 = DateTimeFormatter.ofPattern("MM-dd HH:mm");

    /**
     * 对日期进行格式化
     * @param date
     *     要转换的日期
     * @param pattern
     *     希望转换成什么样的格式
     * @return str
     *     格式化后的日期字符串
     */
    public static String dateFormat(Date date, String pattern){
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        String str = sdf.format(date);
        return str;
    }

    /**
     * 根据初始日期推算期望（向前/向后）日期
     * @param initTime
     *     初始日期（initTime可以是null、Date、String数据类型）
     * @param n
     *     向前/向后推算n天（n可以是正整数、0、负整数）
     * @return
     *     推算后的日期字符串
     */
    public static String getCalculateDay(Object initTime,int n){
        // 返回推算后的日期
        String calculateDay = "";
        try {
            // 实例化日历类Calendar
            Calendar calendar = Calendar.getInstance();
            // 定义日期格式化样式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            // 初始日期
            Date initDate = null;
            // 判断参数类型
            if (null == initTime) {
                // 取系统当前时间
                initDate = new Date();
            } else if (initTime instanceof Date) {
                initDate = (Date)initTime;
            } else {
                // 日期格式字符串转换成日期类Date
                initDate = sdf.parse((String)initTime);
            }
            // 设置日历时间
            calendar.setTime(initDate);
            // 设置推算后的日历时间
            calendar.add(Calendar.DATE, n);
            // 获取推算后的日期
            Date calculateDate = calendar.getTime();
            // 进行格式化
            calculateDay = sdf.format(calculateDate);
        } catch(ParseException e) {
            return calculateDay;
        }
        return calculateDay;
    }

    @SuppressWarnings("all")
    public static String getTimeDescriptionByDate(Date now, Date targetDate) {
        String timeDescription = "";
        if (targetDate != null) {
            // 5. 年内判断
            if (targetDate.getYear() == now.getYear()) {
                // 获取秒数差
                long betweenSeconds = (now.getTime() - targetDate.getTime()) / 1000;
                if (betweenSeconds < ONE_MINUTE_TO_SECOND) {
                    // 1. 1分钟内：刚刚
                    timeDescription = "刚刚";
                } else if (betweenSeconds < ONE_HOUR_TO_SECOND) {
                    // 2. 60分钟内
                    timeDescription = betweenSeconds / ONE_MINUTE_TO_SECOND + "分钟前";
                } else if (betweenSeconds < ONE_HOUR_TO_SECOND * 24) {
                    // 3. 24小时内：x小时前
                    timeDescription = betweenSeconds / ONE_HOUR_TO_SECOND + "小时前";
                } else {
                    // 4. >24小时：x月x日  08-1
                    timeDescription = dateToLocalDateTime(targetDate).format(DATE_TIME_FORMATTER2);
                }
            } else {
                timeDescription = dateToLocalDateTime(targetDate). format(DATE_TIME_FORMATTER1);
            }
        }
        return timeDescription;
    }

    /**
     * date转localDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }
}